home *** CD-ROM | disk | FTP | other *** search
/ 17 Bit Software 6: Level 6 / 17 Bit - Level 6 (1998)(Epic Marketing)[!].iso / quartz / q1082.dms / q1082.adf / src.lzh / Fig / SafeMalloc.c < prev    next >
C/C++ Source or Header  |  1991-07-18  |  1KB  |  79 lines

  1. #include <exec/memory.h>
  2.  
  3. #define SAFETYMARGIN    40
  4.  
  5. struct MemFrag
  6. {
  7.     struct MemFrag    *NextMemFrag;
  8.     ULONG         MemFragSize;
  9. };
  10.  
  11. STATIC struct MemFrag *MemFragList;
  12.  
  13. VOID
  14. memcleanup()
  15. {
  16.     struct MemFrag *MemPointer,*NextMemPointer;
  17.  
  18.     if(MemFragList)
  19.     {
  20.         for(MemPointer = MemFragList ; MemPointer ; MemPointer = NextMemPointer)
  21.         {
  22.             NextMemPointer = MemPointer -> NextMemFrag;
  23.  
  24.             FreeMem(MemPointer,MemPointer -> MemFragSize + sizeof(struct MemFrag));
  25.         }
  26.     }
  27.  
  28.     MemFragList = NULL;
  29. }
  30.  
  31. VOID
  32. free(APTR *blk)
  33. {
  34.     struct MemFrag *MemPointer,*NextMemPointer = NULL;
  35.  
  36.     if(MemFragList)
  37.     {
  38.         for(MemPointer = MemFragList ; MemPointer ; MemPointer = MemPointer -> NextMemFrag)
  39.         {
  40.             if((ULONG)MemPointer + sizeof(struct MemFrag) == (ULONG)blk)
  41.             {
  42.                 if(NextMemPointer)
  43.                     NextMemPointer -> NextMemFrag = MemPointer -> NextMemFrag;
  44.                 else
  45.                     MemFragList = MemPointer -> NextMemFrag;
  46.  
  47.                 FreeMem(MemPointer,MemPointer -> MemFragSize + sizeof(struct MemFrag));
  48.  
  49.                 break;
  50.             }
  51.  
  52.             NextMemPointer = MemPointer;
  53.         }
  54.     }
  55. }
  56.  
  57. APTR
  58. malloc(ULONG MemFragSize)
  59. {
  60.     if(MemFragSize)
  61.     {
  62.         struct MemFrag *MemFragPointer;
  63.  
  64.         MemFragSize += SAFETYMARGIN;
  65.  
  66.         if(MemFragPointer = (struct MemFrag *)AllocMem(MemFragSize + sizeof(struct MemFrag),MEMF_PUBLIC|MEMF_CLEAR))
  67.         {
  68.             MemFragPointer -> NextMemFrag = MemFragList;
  69.             MemFragPointer -> MemFragSize = MemFragSize;
  70.  
  71.             MemFragList = MemFragPointer;
  72.  
  73.             return((APTR)((ULONG)MemFragPointer + sizeof(struct MemFrag)));
  74.         }
  75.     }
  76.  
  77.     return(NULL);
  78. }
  79.